import axios from "axios";

// 创建axios实例
const instance = axios.create(
    // 添加配置参数
    {
        timeout: 1000 * 60,      // 1分钟
        // baseURL:'http://192.168.112.161:8585/api',
    }
)

/**
 * axios的拦截器涉及Promise，参考《JavaScript高级程序设计》第11章
 */

// 配置请求拦截器，用于统一配置请求头（比如大多数页面访问时需要携带token在请求头中
instance.interceptors.request.use(
    function(config){
        // 请求成功处理
        // console.log("request success： ", config)
        // TODO，请求头处理，比如向请求头中添加token
        

        return config;
    }, 
    function(error){
        // 请求错误处理
        // 日志记录（此处仅仅是控制台打印）
        // console.log("request error: ", error);
        
        // TODO, 根据请求状态做出相应的措施

        // 通过Promise扔出错误原因
        return Promise.reject(error)
    }
);


// 配置响应拦截器，用于处理网络请求出现错误时的处理，如跳转404页面等
instance.interceptors.response.use(
    function(response){
        // 响应成功处理
        // console.log("response success: ", response)
        return response;
    },
    function(error){
        // 响应错误处理

        // 通过Promise扔出错误原因
        return Promise.reject(error);
    }
)

// 常用方法封装, 封装目的：只有网络请求成功进行（即服务器有返回了数据）是才进行业务处理，否则直接进行统一的错误处理
// get请求
export function get(url, params){
    return new Promise(
        (resolve, reject) =>{
            instance.get(url, {params: params}).
                then((res)=>{
                    resolve(res.data)
                }).catch((err)=>{
                    reject(err.data)
                })
        }
    )
}

// post请求, post请求一般参数放在的请求体的位置
export function post(url, data){
    return new Promise(
        (resolve, reject) =>{
            instance.post(url, {data: data}).
                then((res)=>{
                    resolve(res.data)
                }).catch((err)=>{
                    reject(err.data)
                })
        }
    )
}

// 导出
export const http = instance